package com.itlaobing.core;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Random;

/**
 *  参数占位符  需在 url 上追加 &useServerPrepStmts=true&cachePrepStmts=true
 */
public class PreparedStatementTest1 {

    private static char[] first = { '朱' , '王' , '孔' , '赵' , '李' };
    private static char[] second = { '仁' , '义' , '礼' , '智' , '孝' };

    private static Random random = new Random();

    public static String generateName(){
        String name = first[ random.nextInt(first.length) ] + "" + second[ random.nextInt(second.length) ]  ;
        return name ;
    }

    public static String gender(){
        return random.nextBoolean() ? "靓仔" : "靓妹" ;
    }

    public static void main(String[] args) throws Exception {

        String driverClassName = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/itlaobing?serverTimezone=Asia/Shanghai&useServerPrepStmts=true&cachePrepStmts=true";
        String user = "root";
        String password = "";

        // 加载驱动
        Class.forName(driverClassName); // ClassNotFoundException

        // 获得连接
        Connection conn = DriverManager.getConnection(url, user, password); // SQLException

        // 书写一个带有 “SQL参数占位符” 的SQL语句
        String sql = "INSERT INTO t_students(name ,gender) VALUES (?,?) ";

        //  通过 Connnection 实例 的 prepareStatement 方法  来创建 PreparedStatement 实例
        //  并将 带句 发送给有 参数占位符 的SQL语数据库服务器，接受数据库服务器返回的几经编译好的SQL指令 标识符 ；
        PreparedStatement ps = conn.prepareStatement(sql);
        System.out.println( ps );

        // 需执行 SQL 指令标识符 时， 首先 通过 PreparedStatement实例 来设置 参数占位符 的值
        // 需要执行已经在数据库服务器端编译好的SQL指令时，首先通过 PreparedStatement实例 来设置 参数占位符 的值
        for (int i = 0; i < 10; i++) {

            ps.setString(1, generateName());
            ps.setString(2, gender());
            System.out.println(ps);

            // ”执行” 已经预先编译好的 SQL语句
            // 1、将保存在PreparedStatement实例的、在数据库服务器已经预编译好的SQL指令的标识符 和 参数占位符的值 发送给数据库服务器
            // 2、获取由数据库服务器返回的执行结果 ( 已经编译好的SQL指令的执行过程是由数据库服务器完成的 )
            int count = ps.executeUpdate();// 通常 执行 DML 语句时 使用 executeUpdate()
            System.out.println(count);
        }
        // 释放资源
        ps.close();
        conn.close();
    }
}
